package 力扣;

/**
 峰值元素是指其值大于左右相邻值的元素。

 给定一个输入数组 nums，其中 nums[i] ≠ nums[i+1]，找到峰值元素并返回其索引。

 数组可能包含多个峰值，在这种情况下，返回任何一个峰值所在位置即可。

 你可以假设 nums[-1] = nums[n] = -∞。

 示例 1:

 输入: nums = [1,2,3,1]
 输出: 2
 解释: 3 是峰值元素，你的函数应该返回其索引 2。
 示例 2:

 输入: nums = [1,2,1,3,5,6,4]
 输出: 1 或 5
 解释: 你的函数可以返回索引 1，其峰值元素为 2；
      或者返回索引 5， 其峰值元素为 6。
 */

public class _162寻找峰值 {

    public int findPeakElement(int[] nums) {
        // 二分查找
        if( nums.length ==1 ) return 0;
        if( nums[1] < nums[0]) return 0;
        if(nums[nums.length-2] < nums[nums.length-1]){
            return nums.length-1;
        }
        int start = 0;
        int end = nums.length -1;
        while( start <= end){
            int mid = ( start + end )>>1;
            if( nums[ mid ] > nums[mid-1] && nums[mid ] > nums[mid+1]){
                return mid;
            }
            if( nums[mid] > nums[mid-1]){ // 说明后面很有可能有峰值
                start = mid+1;
            }else{
                end = mid;
            }
        }
        return -1;
    }
}
